package org.example.licode;

import java.util.*;
import java.util.stream.IntStream;

public class 无重复字符的最长字符串 {
    /**
     * 给定一个字符串 s ，请你找出其中不含
     * 有重复字符的最长
     * 子串的长度。
     */
    public static void main(String[] args) {
        String s = "abcabcbb";
        int i = lengthOfLongestSubstring(s);
        System.out.println(i);;
    }

    /**
     *  s = "pwwkew"
     * 输出: 3
     * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
     * @param s
     * @return
     */
    public static int lengthOfLongestSubstring1(String s) {
        String[] s1=s.split("");
        System.out.println(Arrays.toString(s1));
        List<String> s2=new ArrayList<>();
        for (String s3:s1){
            if (!s2.contains(s3)){
                s2.add(s3);
            }
        }
        System.out.println(s2.toString());
        System.out.println(s2.size());
        return s2.size();

    }

    public static int lengthOfLongestSubstring(String s) {
      //哈希集合，记录每个字符是否出现过
        Set<Character> occ=new HashSet<>() ;
        int n=s.length();
        //右指针，初始值为-1，相当于我们在字符串的左边界，还没有开始移动
        int rk=-1,ans=0;
        for (int i=0;i<n;++i){
            if (i!=0){
                //左指针向右移动一格，移除一个字符
                occ.remove(s.charAt(i-1));
            }
            while(rk+1<n&&!occ.contains(s.charAt(rk+1))){
                //不断地移动右指针
                occ.add(s.charAt(rk+1));
                ++rk;
            }
            //第i到rk个字符是一个极长的无重复字符子串
            ans=Math.max(ans,rk-i+1);
        }
        return ans;

    }

}
